package com.mazaiting.rtda.heap;

import java.util.Objects;

/**
 * 方法查找
 *
 * @author mazaiting
 * @since 2021/8/23
 */
public class MtMethodLookup {

    /**
     * 在当前类中查找方法
     *
     * @param mtClass    类实例
     * @param name       方法名
     * @param descriptor 方法描述
     * @return 方法
     */
    public static MtMethod lookupMethodInClass(MtClass mtClass, String name, String descriptor) {
        // 循环遍历超类
        for (MtClass tmp = mtClass; Objects.nonNull(tmp); tmp = tmp.getSuperClass()) {
            // 循环遍历
            for (MtMethod method : tmp.getMethods()) {
                if (Objects.equals(method.getName(), name) && Objects.equals(method.getDescriptor(), descriptor)) {
                    return method;
                }
            }
        }
        return null;
    }

    /**
     * 在当前类实现的接口中查找方法
     *
     * @param interfaces 接口数组
     * @param name       方法名
     * @param descriptor 方法描述
     * @return 方法
     */
    public static MtMethod lookupMethodInInterfaces(MtClass[] interfaces, String name, String descriptor) {
        for (MtClass anInterface : interfaces) {
            // 方法中查找
            for (MtMethod method : anInterface.getMethods()) {
                if (Objects.equals(method.name, name) && Objects.equals(method.descriptor, descriptor)) {
                    return method;
                }
            }
            // 接口中查找
            MtMethod method = lookupMethodInInterfaces(anInterface.getInterfaces(), name, descriptor);
            if (Objects.nonNull(method)) {
                return method;
            }
        }
        return null;
    }
}


















